﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once
#include "IPositionAssociatedPlane.h"

namespace gcmp
{
    class IDocument;
    /// \brief 带四个偏移量的两个关联平面定位类
    class GCMP_MODEL_INTERFACE_EXPORT IPositionTwoAssociatedPlanesWithFourOffsets : public IPositionAssociatedPlane
    {
        DEFINE_CAST_DERIVED(gcmp::IPositionTwoAssociatedPlanesWithFourOffsets, gcmp::IPositionAssociatedPlane)
    public:
        /// \brief 创建基于带四个偏移量的两个关联平面定位对象
        /// \param pElement 元素指针
        /// \param bottomAssociatedPlaneId 底部关联平面id
        /// \param topAssociatedPlaneId 顶部关联平面id
        /// \return 基于带四个偏移量的两个关联平面定位对象
        static OwnerPtr<IPositionTwoAssociatedPlanesWithFourOffsets> Create(IElement *pElement, const ElementId &bottomAssociatedPlaneId, const ElementId &topAssociatedPlaneId);
    public:
        /// \brief 得到底部关联平面id
        /// \return 底部关联平面id
        virtual ElementId GetBottomAssociatedPlaneId() const = 0;

        /// \brief 设置底部关联平面id
        /// \param associatedPlaneId 关联平面id
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetBottomAssociatedPlaneId(const ElementId &associatedPlaneId) = 0;

        /// \brief 得到顶部关联平面id
        /// \return 顶部关联平面id
        virtual ElementId GetTopAssociatedPlaneId() const = 0;

        /// \brief 设置顶部关联平面id
        /// \param associatedPlaneId 关联平面id
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetTopAssociatedPlaneId(const ElementId &associatedPlaneId) = 0;

        /// \brief 得到起始底部偏移量
        /// \return 起始底部偏移量
        virtual double GetStartBottomOffset() const = 0;

        /// \brief 设置起始底部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetStartBottomOffset(double value) = 0;

        /// \brief 得到起始顶部偏移量
        /// \return 起始顶部偏移量
        virtual double GetStartTopOffset() const = 0;

        /// \brief 设置起始顶部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetStartTopOffset(double value) = 0;

        /// \brief 得到终止底部偏移量
        /// \return 底部偏移量
        virtual double GetEndBottomOffset() const = 0;

        /// \brief 设置终止底部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetEndBottomOffset(double value) = 0;

        /// \brief 得到终止顶部偏移量
        /// \return 顶部偏移量
        virtual double GetEndTopOffset() const = 0;

        /// \brief 设置终止顶部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetEndTopOffset(double value) = 0;

        /// \brief 得到顶部关联平面高度
        /// \return 顶部关联平面高度
        virtual double GetTopAssociatedPlaneHeight() const = 0;

        /// \brief 判断是否允许计算高度值
        /// \return 返回true表示允许计算高度值，否则表示不允许
        virtual bool ShouldCalculateHeight() const = 0;

        /// \brief 根据顶部信息计算出高底值
        /// \param errorMsg 指针有效时，输出错误信息
        /// \return 返回true表示成功计算出高度值，否则表示计算失败
        virtual bool ComputeHeightByTopData(std::wstring* errorMsg) = 0;

        /// \brief 得到起始高度值
        /// \return 起始高度值
        virtual double GetStartHeight() const = 0;

        /// \brief 设置起始高度值
        /// \param value 高度值
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetStartHeight(double value) = 0;

        /// \brief 得到终止高度值
        /// \return 终止高度值
        virtual double GetEndHeight() const = 0;

        /// \brief 设置终止高度值
        /// \param value 高度值
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetEndHeight(double value) = 0;

        /// \brief 更新变截面对象信息
        /// \param maxHeight 最大高度值
        /// \param startHeight 起始高度
        /// \param endHeight 终止高度
        /// \param familyStartBottomOffset 族参数起始底部移量
        /// \param familyEndBottomOffset  族参数终止底部移量
        /// \return 返回true表示成功更新，否则表示失败 
        virtual bool UpdateGradientHeightInfo(double maxHeight, double startHeight, double endHeight, double familyStartBottomOffset, double familyEndBottomOffset)  = 0;
        
        /// \brief 得到变截面对象信息
        /// \param maxHeight 最大高度值
        /// \param startHeight 起始高度
        /// \param endHeight 终止高度
        /// \param familyStartBottomOffset 族参数起始底部移量
        /// \param familyEndBottomOffset  族参数终止底部移量
        /// \return 返回true表示成功得到，否则表示失败 
        virtual bool GetGradientHeightInfo(double &maxHeight, double &startHeight, double &endHeight, double &familyStartBottomOffset, double &familyEndBottomOffset) const = 0;

        /// \brief 设置起点到底部关联平面的偏移量
        /// \param offset 偏移量
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetStartPointToBottomAssociatedPlaneOffset(double offset) = 0;

        /// \brief 设置终点到底部关联平面的偏移量
        /// \param offset 偏移量
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetEndPointToBottomAssociatedPlaneOffset(double offset) = 0;

        /// \brief 设置起点到顶部关联平面的偏移量
        /// \param offset 偏移量
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetStartPointToTopAssociatedPlaneOffset(double offset) = 0;

        /// \brief 设置终点到顶部关联平面的偏移量
        /// \param offset 偏移量
        /// \return 返回true表示成功设置，否则表示失败
        virtual bool SetEndPointToTopAssociatedPlaneOffset(double offset) = 0;

        /// \brief 得到顶部偏移量
        /// \return 顶部偏移量
        virtual double GetTopOffset() const = 0;

        /// \brief 设置顶部偏移量
        /// \param value 偏移量
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetTopOffset(double value) = 0;

    };
}


